home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / sound / sndblst3.zip / SBC.C < prev    next >
Text File  |  1993-10-25  |  4KB  |  145 lines

  1.  
  2. //------------------------------------------------------------------------------
  3. // Copyright (c), David Welch, 1993
  4. //------------------------------------------------------------------------------
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <dos.h>
  9. #include <alloc.h>
  10. #include <string.h>
  11. #include <mem.h>
  12.  
  13. void dspwrite ( unsigned char );
  14. unsigned char dspread ( void );
  15. void sbsetup ( void );
  16. void sbsettc ( unsigned char );
  17. void sbhaltdma ( void );
  18. void sbplay ( unsigned short );
  19. void sbrec ( unsigned short );
  20. void spkon ( void );
  21. void spkoff ( void );
  22.  
  23. unsigned char *data;
  24. unsigned char *aligned;
  25. unsigned long aligned_physical;
  26. //------------------------------------------------------------------------------
  27. void dspwrite ( unsigned char c )
  28. {
  29.     while(inportb(0x022C)&0x80);
  30.     outportb(0x022C,c);
  31. }
  32. //------------------------------------------------------------------------------
  33. unsigned char dspread ( void )
  34. {
  35.     while(!(inportb(0x22E)&0x80));
  36.     return(inportb(0x22A));
  37. }
  38. //------------------------------------------------------------------------------
  39. void sbsetup ( void )
  40. {
  41.     unsigned long physical;
  42.     unsigned short x;
  43.     data=farmalloc(131000L);
  44.     if(data==NULL)
  45.     {
  46.         printf("Memory Allocation Error\n");
  47.         exit(1);
  48.     }
  49.     physical=((unsigned long)FP_OFF(data))+(((unsigned long)FP_SEG(data))<<4);
  50.     aligned_physical=physical+0x0FFFFL;
  51.     aligned_physical&=0xF0000L;
  52.     aligned=MK_FP((unsigned )((aligned_physical >> 4) & 0xFFFF),0);
  53.     inportb(0x022E);
  54.     outportb(0x0226,0x01);
  55.     inportb(0x0226);
  56.     inportb(0x0226);
  57.     inportb(0x0226);
  58.     inportb(0x0226);
  59.     outportb(0x0226,0x00);
  60.     for(x=0;x<100;x++)
  61.     {
  62.         if(inportb(0x022E)&0x80)
  63.         {
  64.             if(inportb(0x022A)==0xAA) break;
  65.         }
  66.     }
  67.     if(x==100)
  68.     {
  69.         printf("Sound Blaster not found at 0220h\n");
  70.         exit(1);
  71.     }
  72. }
  73. //------------------------------------------------------------------------------
  74. void sbsettc ( unsigned char tc )
  75. // tc = time constant = 256L - (1000000UL/samples per second)
  76. {
  77.     inportb(0x022E);
  78.     dspwrite(0x40);
  79.     dspwrite(tc);
  80. }
  81. //------------------------------------------------------------------------------
  82. void sbhaltdma ( void )
  83. {
  84.     dspwrite(0xD0);
  85. }
  86. //------------------------------------------------------------------------------
  87. void spkon ( void )
  88. {
  89.     dspwrite(0xD1);
  90. }
  91. //------------------------------------------------------------------------------
  92. void spkoff ( void )
  93. {
  94.     dspwrite(0xD3);
  95. }
  96. //------------------------------------------------------------------------------
  97. void sbplay ( unsigned short len )
  98. // len = number of bytes pointed to by unsigned char *aligned (<=65000)
  99. {
  100.     len--;
  101.     outportb(0x0A,0x05);
  102.     outportb(0x0C,0x00);
  103.     outportb(0x0B,0x49);
  104.     outportb(0x02,(unsigned char)(aligned_physical&0xFF));
  105.     outportb(0x02,(unsigned char)((aligned_physical>>8)&0xFF));
  106.     outportb(0x83,(unsigned char)((aligned_physical>>16)&0xFF));
  107.     outportb(0x03,(unsigned char)(len&0xFF));
  108.     outportb(0x03,(unsigned char)((len>>8)&0xFF));
  109.     outportb(0x0A,0x01);
  110.     dspwrite(0x14);
  111.     dspwrite((unsigned char)(len&0xFF));
  112.     dspwrite((unsigned char)((len>>8)&0xFF));
  113. }
  114. //------------------------------------------------------------------------------
  115. void sbrec ( unsigned short len )
  116. // len = number of bytes to record to unsigned char *aligned (<=65000)
  117. {
  118.     len--;
  119.     outportb(0x0A,0x05);
  120.     outportb(0x0C,0x00);
  121.     outportb(0x0B,0x45);
  122.     outportb(0x02,(unsigned char)(aligned_physical&0xFF));
  123.     outportb(0x02,(unsigned char)((aligned_physical>>8)&0xFF));
  124.     outportb(0x83,(unsigned char)((aligned_physical>>16)&0xFF));
  125.     outportb(0x03,(unsigned char)(len&0xFF));
  126.     outportb(0x03,(unsigned char)((len>>8)&0xFF));
  127.     outportb(0x0A,0x01);
  128.     dspwrite(0x24);
  129.     dspwrite((unsigned char)(len&0xFF));
  130.     dspwrite((unsigned char)((len>>8)&0xFF));
  131. }
  132. //------------------------------------------------------------------------------
  133. unsigned short dmacount ( void )
  134. {
  135.     unsigned short x;
  136.     x=inportb(0x03);
  137.     x|=inportb(0x03)<<8;
  138.     if(x==0xFFFF) inportb(0x022E);
  139.     return(x);
  140. }
  141. //------------------------------------------------------------------------------
  142. // Copyright (c), David Welch, 1993
  143. //------------------------------------------------------------------------------
  144.  
  145.